class Student:
    def __init__(self, name, age):
        # __开头，表示私有属性
        self.__name = name
        self.__age = age


stu = Student("张三", 20)
print(stu._Student__age)  # 私有属性会被编译器重新命名：_类名+变量名,但不推荐用这种方式访问

print("-" * 200)


#
class Student2:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    # 装饰器模式访问私有属性
    # property注解，将方法转为只读属性
    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, age):
        self.__age = age or '默认值'  # 这里可以使用默认值是因为setter方法与构造方法设计初衷的区分


stu2 = Student2("李世民", 18)
print(stu2.age)  # age是属性，不是方法，切记
stu2.age = 0
print(stu2.age)  # age是属性，不是方法，切记
print("-" * 200)


class Student3:
    def __init__(self, name, age=None):
        self.__name = name
        self.__age = age if age is not None else '默认值'  # 这里是三元表达式，有括号与反斜杠换行

    @property
    def age(self):
        return self.__age

stu3 = Student3("王五")
print(stu3._Student3__age)
print(stu3.age)
